home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MYUTIL / CMPMODS.M < prev    next >
Encoding:
Text File  |  1991-07-16  |  5.8 KB  |  205 lines

  1. MODULE CmpMods;
  2. (*$A+*)
  3.  
  4. (*
  5. IMPORT Debug;
  6. *)
  7.  
  8. (*
  9. Vergleicht die Länge der Prozeduren zweier übersetzteer Module.
  10.  
  11. Wenigstens eins der Module sollte $M+ verwenden, damit
  12. die unterschiedlichen Procs benannt werden können.
  13.  
  14. Funktioniert z.Zt. nur, wenn gleiche Anzahl Procs in beiden Modulen!
  15. *)
  16.  
  17. IMPORT GEMIO;
  18. FROM EasyGEM1 IMPORT SelectFile;
  19. FROM MOSGlobals IMPORT fNoMatchingFiles, PathStr, FileStr;
  20. FROM BinOps IMPORT LowerLCard;
  21. IMPORT Files, Binary;
  22. FROM Directory IMPORT Delete, DirQuery, DirQueryProc, DirEntry, FileAttrSet,
  23.         SetFileAttr;
  24. FROM FileNames IMPORT SplitPath, PathConc;
  25. FROM InOut IMPORT Write, WriteString, WriteCard, WriteLn, Read, WritePg,
  26.         BusyRead, ReadString, GotoXY;
  27. FROM Strings IMPORT Space, Length, Empty, Append, String, Compare, Relation;
  28. FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, ADR, TSIZE, BYTE, WORD, LONGWORD;
  29. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  30. IMPORT Loader, ShellMsg, ModBase, ModCtrl;
  31. FROM ModBase IMPORT PtrModHeader, ModHeader, ModRef;
  32.  
  33. TYPE PL = POINTER TO LONGCARD;
  34.      PC = POINTER TO CHAR;
  35.      PS = POINTER TO ARRAY [0..39] OF CHAR;
  36.  
  37. PROCEDURE wait;
  38.   VAR ch: CHAR;
  39.   BEGIN
  40.     WriteLn;
  41.     WriteString ('Press a key...');
  42.     Read (ch)
  43.   END wait;
  44.  
  45. PROCEDURE skip (VAR pl: ADDRESS);
  46.   BEGIN
  47.     REPEAT INC (pl) UNTIL (PC(pl)^ = 0C);
  48.     IF ODD (pl) THEN INC (pl) END;
  49.     INC (pl, 4)
  50.   END skip;
  51.  
  52. PROCEDURE back (ad: ADDRESS; VAR pl: LONGCARD);
  53.   BEGIN
  54.     DEC (pl, 6);
  55.     REPEAT DEC (pl, 2) UNTIL (PC(ad+pl)^ = 0C);
  56.   END back;
  57.  
  58. PROCEDURE size (header: PtrModHeader; start, end: LONGCARD): LONGCARD;
  59.   (* alle Proc-Namen im Bereich finden und Länge addieren *)
  60.   VAR n: LONGCARD; pn: LONGCARD; p, pa: ADDRESS;
  61.   BEGIN
  62.     n:= 0;
  63.     pn:= header^.body; (* Beim Body fängt die Kette rückw. an *)
  64.     LOOP
  65.       IF pn <= start THEN EXIT END;
  66.       p:= ADDRESS(header) + pn; (* Proc-Adr. absolut *)
  67.       DEC (p, 4); (* zum Ptr vor Name *)
  68.       IF (pn < end) THEN
  69.         pa:= p;
  70.         INC (n, 6);
  71.         DEC (pa,2);
  72.         REPEAT INC (n, 2); DEC (pa,2) UNTIL PC(pa)^ = 0C;
  73.       END;
  74.       pn:= PL(p)^;
  75.     END;
  76.     IF n = 0 THEN HALT END;
  77.     RETURN n
  78.   END size;
  79.  
  80. VAR mn1, mn2: FileStr; dummy: ARRAY [0..11] OF CHAR;
  81.     ad1, ad2: ADDRESS;
  82.     hd1, hd2: PtrModHeader;
  83.     f: Files.File;
  84.     ref1, ref2: ModBase.ModRef;
  85.     s: String;
  86.     syms1, syms2, ok: BOOLEAN;
  87.     co1, co2, len1, len2, clen1, clen2: LONGCARD;
  88.     end1, end2, n1,n2: LONGCARD;
  89.     pa1, pa2, p, pa: ADDRESS;
  90.     pc: PC;
  91.  
  92. VAR pl1, pl2: PL;
  93.  
  94. PROCEDURE find (proc: LONGCARD; VAR pl: PL; VAR len: LONGCARD);
  95.   BEGIN
  96.     ASSEMBLER
  97.         MOVE.L  proc(A6),D0
  98.         MOVE.L  pl(A6),A0
  99.         MOVE.L  (A0),A1
  100.        l:
  101.         MOVE.L  (A1),D1
  102.         BEQ     err
  103.         CMP.L   D1,D0
  104.         BEQ     ende
  105.         ADDQ.L  #8,A1
  106.         BRA     l
  107.       err:
  108.         BREAK
  109.       ende:
  110.         MOVE.L  A1,(A0)
  111.         MOVE.L  len(A6),A0
  112.         MOVE.L  4(A1),(A0)
  113.     END
  114.   END find;
  115.   
  116.  
  117. BEGIN
  118.   mn1:= '';
  119.   SelectFile ('1. Modul?', mn1, ok);
  120.   IF NOT ok THEN RETURN END;
  121.   mn2:= '';
  122.   SelectFile ('2. Modul?', mn2, ok);
  123.   IF NOT ok THEN RETURN END;
  124.   
  125.   Files.Open (f, mn1, Files.readOnly);
  126.   len1:= Binary.FileSize (f);
  127.   ALLOCATE (ad1, len1);
  128.   Binary.ReadBytes (f, ad1, len1, len1);
  129.   Files.Close (f);
  130.   
  131.   Files.Open (f, mn2, Files.readOnly);
  132.   len2:= Binary.FileSize (f);
  133.   ALLOCATE (ad2, len2);
  134.   Binary.ReadBytes (f, ad2, len2, len2);
  135.   Files.Close (f);
  136.   
  137.   INC(ad1, 8);
  138.   INC(ad2, 8);
  139.   hd1:= ad1;
  140.   hd2:= ad2;
  141.   
  142.   syms1:= 4 IN hd1^.id;
  143.   syms2:= 4 IN hd2^.id;
  144.   WriteString (mn1); IF syms1 THEN WriteString (' has symbols') END; WriteLn;
  145.   WriteString (mn2); IF syms2 THEN WriteString (' has symbols') END; WriteLn;
  146.   WriteLn;
  147.   
  148.   co1:= hd1^.codeStart;
  149.   co2:= hd2^.codeStart;
  150.   end1:= hd1^.body;
  151.   end2:= hd2^.body;
  152.   IF syms1 THEN back (ad1, end1) END;
  153.   IF syms2 THEN back (ad2, end2) END;
  154.   
  155.   pl1:= ad1+hd1^.procSize;
  156.   pl2:= ad2+hd2^.procSize;
  157.   
  158.   n1:= 0;
  159.   WHILE pl1^ # 0 DO INC (n1); INC (pl1, 8) END;
  160.   n2:= 0;
  161.   WHILE pl2^ # 0 DO INC (n2); INC (pl2, 8) END;
  162.   WriteString (mn1); WriteString (' has '); WriteCard (n1,0); WriteString (' procs'); WriteLn;
  163.   WriteString (mn2); WriteString (' has '); WriteCard (n2,0); WriteString (' procs'); WriteLn;
  164.   WriteLn;
  165.   
  166.   (*$D-*)
  167.   n1:= 0;
  168.   n2:= 0;
  169.   WHILE (co1 < end1) & (co2 < end2) DO
  170.     pl1:= ad1+hd1^.procSize;
  171.     pl2:= ad2+hd2^.procSize;
  172.     find (co1, pl1, len1);
  173.     find (co2, pl2, len2);
  174.     clen1:= len1;
  175.     clen2:= len2;
  176.     IF syms1 THEN DEC (clen1, size(ad1,co1,co1+len1)) END;
  177.     IF syms2 THEN DEC (clen2, size(ad2,co2,co2+len2)) END;
  178.     IF clen1 # clen2 THEN
  179.       INC (n2);
  180.       IF syms1 THEN
  181.         pc:= ad1+co1+1;
  182.         WHILE pc^#0C DO Write (pc^); INC (pc) END;
  183.         Write (' ')
  184.       ELSIF syms2 THEN
  185.         pc:= ad2+co2+1;
  186.         WHILE pc^#0C DO Write (pc^); INC (pc) END;
  187.         Write (' ')
  188.       END;
  189.     END;
  190.     INC (co1, len1);
  191.     INC (co2, len2);
  192.     INC (n1)
  193.   END;
  194.   WriteLn;
  195.   WriteCard (n1, 4); WriteString (' procs compared');
  196.   WriteLn;
  197.   WriteCard (n2, 4); WriteString (' mismatches found');
  198.   WriteLn;
  199.   (*$D-*)
  200.   
  201.   wait
  202. END CmpMods.
  203. ə
  204. (* $FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$00001235$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3E$FFE45D3EÇ$00000130T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00000804$0000058F$000005CC$000005DB$FFED710E$000005D4$00000033$00001126$00000130$00000828$00000837$0000002F$00000033$00001126$000007ED$00000821ñÇÇ*)
  205.